package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;

/**
 * Okno 2 grafického rozhraní k dotazníku.
 *
 * @author Magda Kutišová
 */
public class Okno2 extends JFrame{

    private JPanel levyPanel;
    private JPanel pravyPanel;
    private JPanel dolniPanel;
    private JCheckBox ridicA;
    private JCheckBox ridicB;
    private JCheckBox neridicB;
    private JCheckBox ridicOstatni;
    private JCheckBox neridic;
    private JList jazyky;
    private DefaultListModel jazykyModel;
    private JButton pridatJazyk;
    private JButton odebratJazyk;
    private JMenuBar menu;
    private JComboBox potraviny;
    private JComboBox pocitac;
    private JComboBox nocni;
    private JButton dalsi;
    private Map<String,String> data;

    /*************************************************************************
     * Konstruktor třídy. Uloží data z předchozího okna a spustí inicializaci tohoto okna.
     * @param data data z předchozího okna
     */
    public Okno2(Map<String,String> data){
        this.data = data;
        init();
    }

    /*************************************************************************
     * Inicializuje okno.
     */
    private void init(){
        BorderLayout vzhledOkna = new BorderLayout(20, 10);
        setTitle("Dotazník - 2. část");
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setName("okno2");
        setLayout(vzhledOkna);

        levyPanel = new JPanel();
        levyPanel.setName("levyPanel");
        pravyPanel = new JPanel();
        pravyPanel.setName("pravyPanel");
        dolniPanel = new JPanel();
        dolniPanel.setName("dolniPanel");

        ridicA = new JCheckBox("Skupina A");
        ridicA.addActionListener(new Ridic());
        ridicA.setName("ridica");
        ridicB = new JCheckBox("Skupina B, řídím aktivně");
        ridicB.addActionListener(new Ridic());
        ridicB.setName("ridicb");
        neridicB = new JCheckBox("Skupina B, neřídím aktivně");
        neridicB.addActionListener(new Ridic());
        neridicB.setName("neridicb");
        ridicOstatni = new JCheckBox("Některá z ostatních skupin (C, D, E...)");
        ridicOstatni.addActionListener(new Ridic());
        ridicOstatni.setName("ridicost");
        neridic = new JCheckBox("Nevlastním žádné řidičské oprávnění");
        neridic.addActionListener(new Ridic());
        neridic.setName("neridic");

        jazykyModel = new DefaultListModel();
        jazyky = new JList(jazykyModel);
        jazyky.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        pridatJazyk = new JButton("Přidat jazyk");
        odebratJazyk = new JButton("Odebrat jazyk");

        levyPanel.setLayout(new BoxLayout(levyPanel, BoxLayout.Y_AXIS));
        levyPanel.add(new JLabel("Vyberte řidičské skupiny, které vlastníte:"));
        levyPanel.add(ridicA);
        levyPanel.add(ridicB);
        levyPanel.add(neridicB);
        levyPanel.add(ridicOstatni);
        levyPanel.add(neridic);
        levyPanel.add(Box.createRigidArea(new Dimension(0, 20)));

        String[] anoNe = {"ano", "ne"};
        potraviny = new JComboBox(anoNe);
        potraviny.setSelectedItem("ne");
        potraviny.setName("potraviny");

        String[] pocData = {"žádná", "uživatelská", "odborník"};
        pocitac = new JComboBox(pocData);
        pocitac.setSelectedItem("žádná");
        pocitac.setName("počítač");

        nocni = new JComboBox(anoNe);
        nocni.setSelectedItem("ne");
        nocni.setName("noční");

        levyPanel.add(new JLabel("Vlastníte průkaz pro práci v potravinářství?"));
        levyPanel.add(potraviny);
        levyPanel.add(new JLabel("Jak byste ohodnotili vaši znalost práce s PC?"));
        levyPanel.add(pocitac);
        levyPanel.add(new JLabel("Byli byste ochotni chodit na noční směny?"));
        levyPanel.add(nocni);
        
        pravyPanel.setLayout(new BoxLayout(pravyPanel, BoxLayout.Y_AXIS));       
        pravyPanel.add(new JLabel("Přidejte jazyky, které ovládáte."));
        JScrollPane obalJazyky = new JScrollPane(jazyky);
        pravyPanel.add(obalJazyky);
        pridatJazyk.addActionListener(new PridatJazyk());
        odebratJazyk.addActionListener(new OdebratJazyk());
        JPanel panel = new JPanel();
        panel.add(pridatJazyk);
        panel.add(odebratJazyk);
        pravyPanel.add(panel);

        dalsi = new JButton("Další");
        dalsi.addActionListener(new Dalsi());
        dolniPanel.add(dalsi);

        levyPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        pravyPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        add(levyPanel, BorderLayout.WEST);
        add(pravyPanel, BorderLayout.CENTER);
        add(dolniPanel, BorderLayout.SOUTH);

        initMenu();

        setJMenuBar(menu);

        pack();
        setLocationRelativeTo(null);
    }

    /*************************************************************************
     * Inicializuje menu.
     */
    private void initMenu(){
        menu = new JMenuBar();
        JMenu soubor = new JMenu("Soubor");
        soubor.setMnemonic('S');
        JMenuItem vynulovat = new JMenuItem("Vynulovat dotazník");
        vynulovat.setMnemonic('V');
        vynulovat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK));
        vynulovat.addActionListener(new Vynulovat());
        soubor.add(vynulovat);
        JMenuItem znovu = new JMenuItem("Začít znovu");
        znovu.setMnemonic('Z');
        znovu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
        znovu.addActionListener(new Znovu());
        soubor.add(znovu);
        JMenuItem konec = new JMenuItem("Konec");
        konec.setMnemonic('K');
        konec.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
        konec.addActionListener(new Konec());
        soubor.add(konec);        
        menu.add(soubor);
        JMenu napoveda = new JMenu("Nápověda");
        napoveda.setMnemonic('N');
        JMenuItem informace = new JMenuItem("Informace");
        informace.setMnemonic('I');
        informace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.ALT_MASK));
        informace.addActionListener(new Informace());
        JMenuItem oProgramu = new JMenuItem("O programu");
        oProgramu.setMnemonic('O');
        oProgramu.addActionListener(new OProgramu());
        napoveda.add(informace);
        napoveda.add(oProgramu);
        menu.add(napoveda);
    }

    private class Vynulovat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            ridicA.setSelected(false);
            ridicB.setSelected(false);
            neridicB.setSelected(false);
            ridicOstatni.setSelected(false);
            neridic.setSelected(false);
            ridicA.setEnabled(true);
            ridicB.setEnabled(true);
            neridicB.setEnabled(true);
            ridicOstatni.setEnabled(true);
            neridic.setEnabled(true);
            potraviny.setSelectedItem("ne");
            pocitac.setSelectedItem("žádná");
            nocni.setSelectedItem("ne");
            jazykyModel.clear();
        }

    }

    private class Znovu implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            dispose();
            Okno1 okno = new Okno1();
            okno.setVisible(true);
        }

    }

    private class Konec implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            int ukoncit = JOptionPane.showConfirmDialog(null, "Opravdu chcete ukončit vyplňování dotazníku a"
                    + " ztratit veškerá zadaná data?", "Opravdu ukončit?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if(ukoncit==0){
                System.exit(0);
            }
            else{
                return;
            }
        }

    }

    private class Informace implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><h1>Instrukce k vyplnění dotazníku</h1>"
                    + "<p>Pro zařazení do naší databáze zájemců o práci prosíme<br>"
                    + "vyplňte všechny tři části tohoto dotazníku.</p>"
                    + "<p>V první části vyplňte své osobní údaje a vystudované<br>"
                    + "školy. Pro přidání každé další školy vždy stiskněte příslušné<br>"
                    + "tlačítko. Povinná pole jsou označena hvězdičkou.</p>"
                    + "<p>Ve druhé části vyplňte doplňující informace o vaší osobě.<br>"
                    + "Do sekce jazyky prosím přidejte všechny jazyky, které znáte,<br>"
                    + "v takovém pořadí, jak dobře se jimi domluvíte,<br>"
                    + "čím výše, tím lepší znalost.</p>"
                    + "<p>V poslední části přetažením přesuňte oblasti, ve kterých<br>"
                    + "máte zájem pracovat, z levého seznamu do pravého a opět je<br>"
                    + "seřaďte přetažením myši, čím výše, tím raději byste v oboru<br>"
                    + "pracovali. Nakonec stiskněte tlačítko \"Odeslat\". Kopie vyplněných<br>"
                    + "údajů bude zaslána na vaši e-mailovou adresu. Děkujeme.</html>"; 
            JOptionPane.showMessageDialog(null, text, "Informace", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class OProgramu implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><p>Program vytvořen v rámci bakalářské práce.</p>"
                    + "<p>Magda Kutišová, březen 2011</p></html>";
            JOptionPane.showMessageDialog(null, text, "O programu", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class Ridic implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            if(ridicA.isSelected() | ridicOstatni.isSelected()){
                neridic.setEnabled(false);
                neridic.setSelected(false);
            }
            if(ridicB.isSelected()){
                neridicB.setEnabled(false);
                neridicB.setSelected(false);
                neridic.setEnabled(false);
                neridic.setSelected(false);
            }
            else{
                neridicB.setEnabled(true);
            }
            if(neridicB.isSelected()){
                ridicB.setEnabled(false);
                ridicB.setSelected(false);
                neridic.setEnabled(false);
                neridic.setSelected(false);
            }
            else{
                ridicB.setEnabled(true);
            }
            if(neridic.isSelected()){
                ridicA.setSelected(false);
                ridicB.setSelected(false);
                neridicB.setSelected(false);
                ridicOstatni.setSelected(false);
                ridicA.setEnabled(false);
                ridicB.setEnabled(false);
                neridicB.setEnabled(false);
                ridicOstatni.setEnabled(false);
            }
            else{
                ridicA.setEnabled(true);
                ridicOstatni.setEnabled(true);
            }
            if(!(ridicA.isSelected() | ridicB.isSelected() | neridicB.isSelected() | ridicOstatni.isSelected())){
                neridic.setEnabled(true);
            }
        }

    }

    private class PridatJazyk implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String jazyk = JOptionPane.showInputDialog(null, "Vyplňte jazyk, který ovládáte:", "Přidat jazyk");
            jazykyModel.addElement(jazyk);
        }

    }

    private class OdebratJazyk implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object jazyk = jazyky.getSelectedValue();
            jazykyModel.removeElement(jazyk);
        }

    }

    private class Dalsi implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            //zkontroluje, zda je vyplněné řízení
            if (!(ridicA.isSelected() | ridicB.isSelected() | neridicB.isSelected() | ridicOstatni.isSelected() | neridic.isSelected())){
                JOptionPane.showMessageDialog(null, "Vyplňte, jaké vlastníte řidičské oprávnění", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            //uloží data do proměnných
            if (ridicA.isSelected()){
                data.put("40. Řidičské oprávnění A", "ano");
            }
            if (ridicB.isSelected()){
                data.put("41. Řidičské oprávnění B, aktivní", "ano");
            }
            if (neridicB.isSelected()){
                data.put("42. Řidičské oprávnění B, pasivní", "ano");
            }
            if (ridicOstatni.isSelected()){
                data.put("43. Řidičské oprávnění C, D, E", "ano");
            }
            if (neridic.isSelected()){
                data.put("44. Bez řidičského oprávnění", "ano");
            }
            data.put("45. Zdravotní průkaz pro práci v potravinářství", potraviny.getSelectedItem().toString());
            data.put("46. Zkušenosti s počítačem", pocitac.getSelectedItem().toString());
            data.put("47. Noční služby", nocni.getSelectedItem().toString());
            Object[] jazyky = jazykyModel.toArray();
            if(jazyky.length != 0){
                String seznamJazyku = "";
                for (Object jazyk : jazyky){
                    seznamJazyku = seznamJazyku + " " + jazyk;
                }
                seznamJazyku = seznamJazyku.trim();
                data.put("48. Cizí jazyky", seznamJazyku);
            }
            //přejde do dalšího okna
            Okno3 okno3 = new Okno3(data);
            dispose();
            okno3.setVisible(true);
        }

    }

}
